#pragma once

#include <QObject>
#include <QQmlApplicationEngine>
#include <QFontDatabase>
#include <QFont>
#include <memory>

// Forward declarations
namespace infrastructure {
class ServiceContainer;
}

namespace presentation {
namespace factories {
class ViewModelFactory;
}
}

/**
 * @brief AGV模块管理器
 * @details 负责QML界面的完整构造、类型注册、模块初始化和接口配置
 */
class ModuleManager : public QObject
{
    Q_OBJECT

public:
    explicit ModuleManager();
    virtual ~ModuleManager() = default;

    /**
     * @brief 创建并初始化QML应用
     * @return bool 创建是否成功
     */
    bool createAndInitialize();

    /**
     * @brief 设置服务容器（用于依赖注入）
     */
    void setServiceContainer(std::shared_ptr<infrastructure::ServiceContainer> container);

    /**
     * @brief 获取ViewModel工厂
     */
    presentation::factories::ViewModelFactory* getViewModelFactory() const;

    /**
     * @brief 获取QML引擎
     */
    QQmlApplicationEngine* engine();

    /**
     * @brief 注册QML类型
     */
    void registerQmlTypes();

    /**
     * @brief 初始化QML接口
     * @param url QML主文件URL
     */
    void initializeQmlInterface(const QUrl& url);

private slots:
    /**
     * @brief 应用退出时清理
     */
    void onApplicationQuit();

private:
    /**
     * @brief 配置字体
     */
    void configureFonts();

    /**
     * @brief 设置上下文属性
     */
    void setupContextProperties();

    /**
     * @brief 创建全局ViewModels并注册为上下文属性
     */
    void createGlobalViewModels(QQmlContext* context);

    /**
     * @brief 初始化资源系统
     */
    void initializeResources();

private:
    QQmlApplicationEngine m_engine;  // 使用栈对象而不是智能指针
    std::shared_ptr<infrastructure::ServiceContainer> m_serviceContainer;
    std::unique_ptr<presentation::factories::ViewModelFactory> m_viewModelFactory;

    // 全局ViewModels（作为上下文属性暴露给QML）
    QObject* m_globalMapViewModel{nullptr};
    QObject* m_globalDashboardViewModel{nullptr};
    QObject* m_globalTaskViewModel{nullptr};
    QObject* m_globalVehicleViewModel{nullptr};
    QObject* m_globalResourceViewModel{nullptr};
    QObject* m_globalSimulatorViewModel{nullptr};
    QObject* m_globalLogViewModel{nullptr};
};
